查看原文
其他

详解轻量日志聚合系统Loki架构

运维研习社 运维研习社 2022-11-05

哈喽哈喽大家好,上次初探Loki之后,就决定把ELK下掉,

上次的初探文章中,只是简单的对Loki做了一个入门介绍,并且很多小伙伴对于我要把ELK换掉的想法有不同的意见

所以这次我来说说我的想法

运维的核心目标是保障系统的稳定性和可靠性,而监控是贯穿整个运维生命周期的,为系统的稳定和可靠提供了可观察性及历史可追溯性,可以说,没有监控,运维就是在抓瞎

在整个运维生命周期中,监控覆盖硬件/系统级监控、应用服务指标监控、程序运行日志监控、业务监控、链路监控

而日志监控主要就是关注程序运行状态,当然,如果涉及业务日志,日志监控也能体现业务运行情况及业务访问量等

日志架构通常的做法就是:

  • 日志收集
  • 日志处理
  • 日志存储
  • 日志可视化

Loki与ELK抉择

而在Loki之前,你要问运维开源的日志解决方案,似乎只有ELK

不可否认,ELK通过对日志全文索引及列式存储,为日志存储及分析带来极大的便利性

但是从另一个角度来讲,这样的便利是通过极高的成本换来的,包括服务器成本和运维成本,而存储的日志中,高价值的日志却很少,这样的成效比是极低的

而Loki则恰恰相反,Loki不会对日志数据建立全文索引,取而代之的是对非结构化日志数据进行压缩存储,并且只对日志数据的metadata(时间戳、labels等)建立索引,所以相比ELK,它的存储成本更低,查询效率也更高

但是Loki也有缺点,就是如果想实现像ELK一样的复杂度比较高的查询,需要设计好Labels,如果对labels设计不合理,会使Loki对数据流的存储和查询带来极大的挑战,会使Loki崩溃,后面会专门写一篇对Loki的labels进行详细的分析的文章,今天只对Loki数据处理及功能组件进行分析

Loki的功能组件

Loki包含以下几个功能组件

  • Promtail
  • Distributor
  • Ingester
  • Querier
  • Query Frontend
  • Overrides
  • TableManager
  • RuntimeConfig

Loki架构图

Promtail

Promtail是负责日志数据的采集、提取、匹配、过滤、打lables、Push to loki这些工作的

支持的采集方式包括File Target、Journal Target、Syslog Target、Stdin Target

整个Promtail对日志数据处理流程如下

Promtail数据处理流程图

Distributor

Distributor主要接收Promtail Push过来的日志数据,并把日志数据分发给Ingester

Distributor与Ingester之间以RPC的方式进行通信,它通过对元数据进行hash算法计算出将日志数据分发到哪一个Ingester上

Distributor以日志数据的TenantID、Labels作为Hash key

Ingester

Ingester负责接收数据并构建chunk,存储日志索引及数据

Ingester构建chunk

当一个chunk填充满之后,ingester将其刷新到数据库,块和索引分别进行存储

Ingester存储chunk和index

刷新完一个chunk之后,Ingester会创建一个空的chunk

Querier

Querier负责数据读取,它通过给定的一个时间范围和标签选择器,查看索引以确定哪些块匹配,并通过greps聚合各个Ingester中的数据,并将结果返回给client

Grafana

Loki的数据查询,都是通过Grafana,在Grafana中支持loki的数据源,通过配置Loki的接口地址即可

Grafana的查询,支持LogQL,在Grafana中查询都是通过Label或log文本,支持语法如下:

Lable的操作符:

  • = exactly equal
  • != not equal
  • =~ regex-match
  • !~ do not regex-match

示例:{app="mysql",name=~"mysql-backup"}

Log文本内容操作:

  • |= exactly equal
  • != not equal
  • |~ regex-match
  • !~ do not regex-match

示例:

  • {app="mysql",name=~"mysql-backup"} |~ "relog“
  • {app="mysql",name=~"mysql-backup"} |~ "relog" !~ "slow"

以上就是今天整理的Loki的数据处理流程及功能组件作用的详细解释,下一篇会对Loki中数据流的概念以及Grafana中查询语法,Labels设计进行详细的分析,敬请期待!




运维技术交流群

「运维研习社」建立了运维技术交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起进群交流学习。


扫描添加好友邀您进运维交流群


免费知识星球

「运维研习社」同时建立了免费知识星球做运维知识沉淀,大家可以直接扫码进星球。欢迎进星球提问或发表看法。


初探Loki,我决定把ELK替掉!

MySQL不停机不锁表主从搭建

Nginx通过这个配置减少TIME-WAIT

如何从Docker中提取Dockerfile?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存